﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace ПросмотрщикШаблонов
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow ()
        {
            InitializeComponent();
        }

        private void Window_Loaded ( object sender, RoutedEventArgs e )
        {
            Type contT = typeof (Control);
            var ass = Assembly.GetAssembly(typeof (Control));
            List<Type> derTypes= new List<Type>();
            foreach (var derType in ass.GetTypes())
            {
                if (derType.IsSubclassOf(contT) && !derType.IsAbstract && derType.IsPublic)
                    derTypes.Add(derType);
            }
            list.ItemsSource = derTypes;
        }

        private void list_SelectionChanged ( object sender, SelectionChangedEventArgs e )
        {
            try
            {
                // Получить выбранный тип. 
                var type = ( Type ) list.SelectedItem;
                // Создать экземпляр типа. 
                ConstructorInfo info = type.GetConstructor( System.Type.EmptyTypes );
                var control = ( Control ) info.Invoke( null );
                // Добавить его в Grid (оставив скрытым). 
                control.Visibility = Visibility.Collapsed;
                grid.Children.Add( control );
                // Получить шаблон. 
                ControlTemplate template = control.Template;
                // Получить XAML-разметку для шаблона. 
                var settings = new XmlWriterSettings {Indent = true};
                var sb = new StringBuilder();
                XmlWriter writer = XmlWriter.Create( sb, settings );
                XamlWriter.Save( template, writer );
                // Отобразить шаблон. 
                text.Text = sb.ToString();
                // Удалить элемент управления из Grid. 
                grid.Children.Remove( control );
                writer.Close();
                
            }
            catch ( Exception err )
            {
                // При генерации шаблона возникла ошибка. 
                text.Text = "<< Error generating template: " + err.Message + ">>";
            } 

        }
    }
}
